import Database from 'better-sqlite3';
import {EntityClass} from './base';

/**
 * SQLite数据类型
 */
export type SQLiteDataType =
  | 'INTEGER'
  | 'REAL'
  | 'TEXT'
  | 'BLOB'
  | 'NUMERIC'
  | 'BOOLEAN'
  | 'DATE'
  | 'DATETIME';

/**
 * 外键动作类型
 */
export type ForeignKeyAction = 'CASCADE' | 'RESTRICT' | 'SET NULL' | 'SET DEFAULT';

/**
 * 主键生成配置
 */
export interface PrimaryKeyConfig {
  /**
   * 是否自动生成ID主键（默认：true）
   */
  autoGenerateId?: boolean;

  /**
   * ID生成策略（默认：AUTO_INCREMENT）
   */
  idGenerationStrategy?: IdGenerationStrategy;

  /**
   * 自定义ID生成器（仅当idGenerationStrategy为CUSTOM时使用）
   */
  customIdGenerator?: IdGenerator;

  /**
   * 雪花算法的节点ID（仅当idGenerationStrategy为SNOWFLAKE时使用）
   */
  snowflakeNodeId?: number;
}

/**
 * 逻辑删除配置
 */
export interface LogicalDeleteConfig {
  /**
   * 逻辑删除字段名
   */
  deletedField?: string;

  /**
   * 标记为已删除的值
   */
  deletedValue?: any;

  /**
   * 标记为未删除的值
   */
  notDeletedValue?: any;
}

/**
 * 数据库选项
 */
export interface DatabaseOptions {
  /**
   * 数据库文件路径
   */
  dbPath: string;
  /**
   * 启用WAL模式以提高性能（默认：true）
   */
  enableWAL?: boolean;
  /**
   * 启用外键支持（默认：true）
   */
  enableForeignKeys?: boolean;
  /**
   * Better-sqlite3选项
   */
  sqliteOptions?: Database.Options;
  /**
   * 自动初始化的实体类列表
   */
  entities?: EntityClass[];
  /**
   * 数据库实例名称，用于区分多个数据库
   */
  name?: string;
  /**
   * 默认列类型，用于未指定类型时使用
   */
  defaultColumnType?: SQLiteDataType;
  /**
   * 主键生成配置
   */
  primaryKeyConfig?: PrimaryKeyConfig;
  /**
   * 是否启用加密功能（需要安装better-sqlite3-multiple-ciphers）
   */
  enableEncryption?: boolean;
  /**
   * 数据库密码，当enableEncryption=true时使用
   * 注意：出于安全考虑，此密码不会被保存到内存中
   */
  password?: string;
  /**
   * 逻辑删除配置
   */
  logicalDelete?: LogicalDeleteConfig;
  /**
   * 是否启用类型强校验
   * 为true时：执行SQL时会严格校验值与字段类型是否匹配，不匹配则抛出异常
   * 为false时：自动适配值类型到字段类型（SQLite的默认行为）
   * 默认：false
   */
  enableStrictTypeCheck?: boolean;
}

/**
 * ID生成策略枚举
 */
export enum IdGenerationStrategy {
  /**
   * 自动递增 (SQLite内置)
   */
  AUTO_INCREMENT = 'AUTO_INCREMENT',

  /**
   * UUID v4
   */
  UUID = 'UUID',

  /**
   * 时间戳 (毫秒)
   */
  TIMESTAMP = 'TIMESTAMP',

  /**
   * 雪花算法 (Snowflake)
   */
  SNOWFLAKE = 'SNOWFLAKE',

  /**
   * 自定义生成器
   */
  CUSTOM = 'CUSTOM'
}

/**
 * ID生成器接口
 */
export interface IdGenerator {
  /**
   * 生成一个唯一ID
   * @returns 生成的唯一ID
   */
  generate(): string | number;

  /**
   * 获取字段类型
   * @returns 字段类型
   */
  fieldType(): SQLiteDataType;
}

/**
 * 数据库加密选项
 */
export interface DatabaseEncryptionOptions {
  /**
   * 数据库密码
   */
  password: string;
}
